package ar.edu.utn.frba.dds.aterrizar;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.dds.aterrizar.aerolineas.AerolineaLanchitaAdapter;
import ar.edu.utn.frba.dds.aterrizar.aerolineas.AerolineaOceanicAdapter;
import ar.edu.utn.frba.dds.aterrizar.aerolineas.AerolineasInterface;
import ar.edu.utn.frba.dds.aterrizar.busquedas.Busqueda;
import ar.edu.utn.frba.dds.aterrizar.busquedas.Vuelo;
import ar.edu.utn.frba.dds.aterrizar.domain.fechas.ConversorDeFormato;
import ar.edu.utn.frba.dds.aterrizar.mocks.MockAerolineaLanchita;
import ar.edu.utn.frba.dds.aterrizar.usuarios.Estandar;
import ar.edu.utn.frba.dds.aterrizar.usuarios.NoPaga;
import ar.edu.utn.frba.dds.aterrizar.usuarios.Usuario;
import ar.edu.utn.frba.dds.aterrizar.usuarios.VIP;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;

import org.junit.Before;
import org.junit.Test;

import com.lanchita.AerolineaLanchita;
import com.lanchita.excepciones.CodigoErroneoException;

public class testReservas 
{
	Busqueda restriccionDeClaseYUbicacion;
	
	
	Usuario usuarioEstandar = new Usuario("Pepa", new VIP(), "Pipa", "0", restriccionDeClaseYUbicacion);
	Usuario usuarioEstandar2 = new Usuario("Pepa", new VIP(), "Pipa", "0", restriccionDeClaseYUbicacion);
	Usuario usuarioVIP = new Usuario("Pepa", new VIP(), "Pipa", "0", restriccionDeClaseYUbicacion);
	Usuario usuarioNoPaga = new Usuario("Pepa", new VIP(), "Pipa", "0", restriccionDeClaseYUbicacion);
	
	AerolineasInterface aerolinea;
	
	ArrayList<Vuelo> lstAsientos = new ArrayList<Vuelo>();
	
	Vuelo oAstientoEjemploLanchita;
	Vuelo oAstientoEjemploOceanic;
	@Before
	public void setUp() 
	{
		aerolinea = AerolineaOceanicAdapter.getInstance();// aca ponemos la aerolinea que vamos a usar como unos campeones
		lstAsientos = aerolinea.getAsientosTotales();
		
		oAstientoEjemploOceanic = new Vuelo();
		oAstientoEjemploOceanic.setCodigoDeAsiento("OC100");
		oAstientoEjemploOceanic.setCodigoDeVuelo("10");
	}

	@SuppressWarnings("La fecha de expiracion de la reserva esta hardcodeado")
	@Test
	public void reservarUsuarioEstandarAsientoReservado() 
	{
		Vuelo oVuelo = BuscarAsientoOcupado(lstAsientos);
		
		if(oVuelo != null)
		{
			Reserva oReserva = new Reserva();
			oReserva.Reservar(aerolinea, oVuelo, usuarioEstandar, new Date(2012,8,20));
			assertEquals(oVuelo.getSobreRecarga().get(oVuelo.getSobreRecarga().size()).usuario, usuarioEstandar);
		}
		else
		{
			// no hay asientos reservados de entrada
			assertEquals(1, 1);
		}
	}
	
	@SuppressWarnings("La fecha de expiracion de la reserva esta hardcodeado")
	@Test
	public void reservarUsuarioNoEstandarAsientoReservado() 
	{
		
		Vuelo oVuelo = BuscarAsientoOcupado(lstAsientos);
		if(oVuelo != null)
		{
			Reserva oReserva = new Reserva();
			SobreRecarga sr = oVuelo.getSobreRecarga().get(oVuelo.getSobreRecarga().size()); //guardo ultima sobre-reserva
			oReserva.Reservar(aerolinea, oVuelo, usuarioVIP, new Date(2012,8,20));
			assertEquals(oVuelo.getSobreRecarga().get(oVuelo.getSobreRecarga().size()), sr);
		}
		else
		{
			// no hay asientos reservados de entrada
			assertEquals(1, 1);
		}
	}
	@Test
	public void reservarUsuarioEstandarAsientoReservadoSinSobreReserva() 
	{
		Vuelo oVuelo = BuscarAsientoLibre(lstAsientos);
		if(oVuelo != null)
		{
			Reserva oReserva = new Reserva();
			oReserva.Reservar(aerolinea, oVuelo, usuarioVIP, new Date(2012,8,20));
			assertEquals(oVuelo.getSobreRecarga().get(0).usuario, usuarioVIP); 
		}
		else
		{
			// no hay asientos libres
			assertEquals(1, 1);
		}
	}
	@Test
	public void comprarAsiento() 
	{
		Vuelo oVuelo = aerolinea.encontrarVueloPorCodigo(oAstientoEjemploLanchita);
		aerolinea.comprarVuelo(oVuelo, usuarioEstandar);
	}
	private Vuelo BuscarAsientoOcupado(List<Vuelo> lstAsientos)
	{
		Vuelo oVuelo = null;
		for (int i = 0; i < lstAsientos.size(); i++) 
		{
			oVuelo = lstAsientos.get(i);
			if(oVuelo.getEstado() == "R") // Disp Res Compr
				break;
			else
				oVuelo = null;
		}
		return oVuelo;
	}
	private Vuelo BuscarAsientoLibre(List<Vuelo> lstAsientos)
	{
		Vuelo oVuelo = null;
		for (int i = 0; i < lstAsientos.size(); i++) 
		{
			oVuelo = lstAsientos.get(i);
			if(oVuelo.getEstado() == "D") // Disp Res Compr
				break;
			else
				oVuelo = null;
		}
		return oVuelo;
	}
}
